#include "LQ_ADC.h"
#include "IfxEvadc_reg.h"
#include "IfxEvadc_regdef.h"
#include "IfxEvadc.h"
#include "IfxEvadc_Adc.h"

// /**
//  * ADC转换结构体
//  */
// Ifx_EVADC_G_RES conversionResult;

/*************************************************************************
 *  函数名称：void ADC_init(void)
 *  功能说明：ADC初始化函数
 *  参数说明：channel  ADC通道
 *  参数说明：Freq_Hz  ADC通道采样频率     注意 ADC有三个模块 通道0-13  16-25  35-49分别属于这三个通道  这里使用扫描采样方式，因此如果一个ADC模块同时初始化了N个通道，则ADC实际采用率 = Freq_Hz / N
 *  函数返回：无
 *  备    注：     注意 adc采样率最高1000000
 *************************************************************************/
void ADC_InitConfig(ADC_Channel_t channel, unsigned long Freq_Hz)
{
    static uint8 mudule_init_flag = 0;
    static uint8 group_init_flag[9];
    IfxEvadc_Adc evadc;
    IfxEvadc_Adc_Group adcGroup;
    IfxEvadc_Adc_Config adcConfig;
    IfxEvadc_Adc_GroupConfig adcGroupConfig;

    IfxEvadc_Adc_initModuleConfig(&adcConfig, &MODULE_EVADC);
    if (!mudule_init_flag)
    {
        mudule_init_flag = 1;
        IfxEvadc_Adc_initModule(&evadc, &adcConfig);
    }
    else
    {
        evadc.evadc = adcConfig.evadc;
    }

    IfxEvadc_Adc_initGroupConfig(&adcGroupConfig, &evadc);

    adcGroupConfig.groupId = (IfxEvadc_GroupId)(ADC_GetGroup(channel));
    adcGroupConfig.master = adcGroupConfig.groupId;
    adcGroupConfig.arbiter.requestSlotQueue0Enabled = TRUE;
    adcGroupConfig.queueRequest[0].triggerConfig.gatingMode = IfxEvadc_GatingMode_always;
    adcGroupConfig.inputClass[0].sampleTime = 1.0f / Freq_Hz;
    adcGroupConfig.inputClass[1].sampleTime = 1.0f / Freq_Hz;

    if (!group_init_flag[ADC_GetGroup(channel)])
    {
        group_init_flag[ADC_GetGroup(channel)] = 1;
        IfxEvadc_Adc_initGroup(&adcGroup, &adcGroupConfig);
    }
    else
    {
        adcGroup.groupId = adcGroupConfig.groupId;
        adcGroup.module = *adcGroupConfig.module;
        adcGroup.group = &adcGroupConfig.module->evadc->G[adcGroup.groupId];
    }

    IfxEvadc_Adc_Channel adcChannel;
    IfxEvadc_Adc_ChannelConfig adcChannelConfig;

    IfxEvadc_Adc_initChannelConfig(&adcChannelConfig, &adcGroup);
    adcChannelConfig.channelId = (IfxEvadc_ChannelId)(ADC_GetChannel(channel));
    adcChannelConfig.resultRegister = (IfxEvadc_ChannelResult)(ADC_GetChannel(channel));
    IfxEvadc_Adc_initChannel(&adcChannel, &adcChannelConfig);
    IfxEvadc_Adc_addToQueue(&adcChannel, IfxEvadc_RequestSource_queue0, IFXEVADC_QUEUE_REFILL);
    IfxEvadc_Adc_startQueue(&adcGroup, IfxEvadc_RequestSource_queue0);
}

/*************************************************************************
 *  函数名称：unsigned short ADC_Read(ADC_Channel_t  chn)
 *  功能说明：ADC采集
 *  参数说明：chn    : ADC通道
 *  函数返回：ADC数值
 *  备    注：
 *************************************************************************/
Ifx_EVADC_G_RES conversionResult;
unsigned short ADC_Read(ADC_Channel_t chn)
{

    // ADC转换结构体

        // 等待转换完成
    do
    {
        conversionResult = IfxEvadc_getResult(&MODULE_EVADC.G[ADC_GetGroup(chn)], ADC_GetChannel(chn));
    } while (!conversionResult.B.VF);

    return conversionResult.B.RESULT; // 返回转换结果
}

/*************************************************************************
 *  函数名称：unsigned short ADC_Read(ADC_Channel_t  chn)
 *  功能说明：ADC多次采集取平均值
 *  参数说明：chn    : ADC通道
 *  参数说明：count  : 采集次数
 *  函数返回：ADC数值
 *  备    注：
 *************************************************************************/
unsigned short ADC_ReadAverage(ADC_Channel_t chn, unsigned char count)
{
    unsigned short i = 0;
    unsigned long sum = 0;
    for (i = 0; i < count; i++)
    {
        sum += ADC_Read(chn);
    }
    return (unsigned short)(sum / count); // 返回转换结果
}
